Skip to main content

基础概念

零、前言

本金记录一些最基础的Github Actions 知识,使用这些知识可以对Github Action有最初步的理解

官方文档官方市场、操作记录

什么是GitHub Actions ?

大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。

常用使用流程

  • 创建一个github的ser

  • 设置触发点

    • 设置忽略文件
  • 拉取仓库代码

一、基本概念

  • workflow 文件
  • 常用钩子
    • cache
    • matrix

二、基础语法

钩子的编写语法

on: push

on: [push]

命令换行

每个步骤也都有一个name: 表示该步骤的名称。run: 后面添加你自己要执行的命令,如果有多条命令,用| 换行。如果只有一行命令,可以直接写作run: 后面

- name: Update zhihu
run: |
cd zhihu
sh run.sh

指定 shell 类型(cmd or powershell)

使用 shell 关键字,来指定特定的 shell:

steps:
- name: Display the path
run: echo $PATH
shell: bash

运行命令

使用 run 关键字

# 单行命令
- name: Install Dependencies
run: npm install
# 多行命令
- name: Clean install dependencies and build
run: |
npm ci
npm run build

使用矩阵

是有时候,我们的代码可能编译环境有多个。

比如 electron 的程序,我们需要在 macos 上编译 dmg 压缩包,在 windows 上编译 exe 可执行文件。

这类情况就可以使用矩阵来解决

下面这段代码就会执行 6 次—— 2 x 3 = 6次

runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-18.04]
node: [6, 8, 10]
steps:
- uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}

修改工作目录

使用 working-directory 关键字,我们可以指定 command 的运行位置:

- name: Clean temp directory
run: rm -rf *
working-directory: ./temp

三、环境变量

相关资料:

使用方式:

# 方式1 ${{上下文对象.属性名}}
run: echo "🎉github.event_name -> ${{ github.event_name }}"

# 方式2:${{上下文对象['属性名']}}
run: echo "🎉github.event_name2 -> ${{ github['event_name'] }}"

# 方式3:$ENV_NAME ($下上文对象_属性名)
run: echo "🎉github.event_name3 -> $GITHUB_EVENT_NAME"
run: echo "🎉github.event_name3 -> " $GITHUB_EVENT_NAME

上下文对象对应表:

上下文名称类型描述
github对象工作流程运行的相关信息。 更多信息请参阅 github 上下文
env对象包含工作流程、作业或步骤中设置的环境变量。 更多信息请参阅 env 上下文
job对象有关当前运行的作业的信息。 更多信息请参阅 job 上下文
steps对象有关当前作业中已运行的步骤的信息。 更多信息请参阅 steps 上下文
runner对象运行当前作业的运行程序相关信息。 更多信息请参阅 runner 上下文
secrets对象包含可用于工作流程运行的机密的名称和值。 更多信息请参阅 secrets 上下文
strategy对象有关当前作业的矩阵执行策略的信息。 更多信息请参阅 strategy 上下文
matrix对象包含在工作流程中定义的应用于当前作业的矩阵属性。 更多信息请参阅 matrix 上下文
needs对象包含定义为当前作业依赖项的所有作业的输出。 更多信息请参阅 needs 上下文
inputsobject包含可重用工作流的输入。 更多信息请参阅 inputs 上下文

四、常用钩子

详细教程

1、全局匹配

on: push

所有push操作都会触发

2、指定分支

on:
push:
branches:
- 'main'
- 'master'
- 'release/**'

仅当在 main或者master分支收到推送时时才触发

3、指定文件

on:
push:
paths:
- '**.js'

4、指定tag

on:
push:
tags:
- v1.**

当有人推送以 v1. 开头的标记时,此工作流程将运行

5、指定分支同时指定文件

# 指定某分支
on:
push:
branches:
- 'release/**'
paths:
- '**.js'

仅当向名称以 releases/开头的分支发生推送,且包含 JavaScript (.js) 文件时才会运行工作流程

定时任务(注意时差)

Github Actions 的定时任务是根据 crontab guru语法 进行配置的,可以非常灵活的定制各种执行条件,不过需要注意的是定时任务只是表示github会在指定时间将我们的workflow加入它的执行队列,并不等于在指定时间马上执行。

on:
schedule:
- cron: '30 5 * * 1,3'
- cron: '30 5 * * 2,4'

jobs:
test_schedule:
runs-on: ubuntu-latest
steps:
- name: Not on Monday or Wednesday
if: github.event.schedule != '30 5 * * 1,3'
run: echo "This step will be skipped on Monday and Wednesday"
- name: Every time
run: echo "This step will always run"

上面脚本定义了两个setps,一个每次都会执行,一个仅在 schedule 符合条件时,当前设置了周一和周三才会执行

这里的定时任务指定的时间和我们中国的时区是有时差的。北京时间比Github所使用时区快8个小时。比如7月1号23点,github时间是7月1号15点。所以我们可以配置成15点或16点执行(对应北京时间的夜里11点、12点)。

计划任务语法有五个字段,中间用空格分隔,每个字段代表一个时间单位。

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *
运算符描述示例
*任意值15 * * * 每天每小时的每个第 15 分钟运行。
,值列表分隔符2,10 4,5 * * * 在每天第 4 和第 5 小时的第 2 和第 10 分钟运行。
-值的范围30 4-6 * * * 在第 4、5 和 6 小时的第 30 分钟运行。
/步骤值20/15 * * * * 从第 20 分钟到第 59 分钟每隔 15 分钟运行(第 20、35 和 50 分钟)。

五、常用的actions

官方市场

记录一些常用的官方或者第三方 acions

以下actions都是紧接在 uses: <action> 后面

官方ActionsActions类型
下载分支actions/checkout@v3官方
缓存文件actions/cache@v2官方
node环境actions/setup-node@v3官方
上传文件actions/upload-artifact@v3官方
发布1action gh-release
发布2Github-Release-Action
发布3action-automatic-releases
第三方ActionActions
npm 发布JS-DevTools/npm-publish@v1
github Releasesoftprops/action-gh-release@v1

环境配置

Actions说明类型
下载nodejs环境actions/setup-node@v3

cache - 缓存

官方文档也有说明 缓存文档

缓存大致原理就是把目标路径打包存储下来,并记录一个唯一key。

下次启动时,根据key去查找。找到了就再按路径解压开。

注意缓存有大小限制。对于免费用户,单个包不能超过500MB,整个仓库的缓存不能超过2G。

steps:
...
- use: actions/cache@v1
with:
...
...

NaN、参考资料